/* CsJni - .NET / Java Bridge
 * 
 * Copyright 2010 Robert E. Burke Licensed under the Apache License, Version 
 * 2.0 (the "License"); you may not use this file except in compliance with 
 * the License. You may obtain a copy of the License at 
 * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable 
 * law or agreed to in writing, software distributed under the License is 
 * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
 * KIND, either express or implied. See the License for the specific language 
 * governing permissions and limitations under the License. 
*/

using System;
using System.Collections.Generic;
using System.Text;

namespace CsJni.PlatformAbstraction
{
    enum JniPlatformId
    {
        Unsupported,
        Windows,
        Mac,
        Unix, // not supported yet
        Linux
    }

    internal sealed class PlatformFactory
    {
        private PlatformFactory() { }

        private static IPlatform mPlatform; // TODO - review statics
        private static JniPlatformId mPlatformId = DiscoverPlatformId();

        internal static JniPlatformId PlatformId { get { return mPlatformId; } }

        // http://www.mono-project.com/FAQ:_Technical
        private static JniPlatformId DiscoverPlatformId()
        {
            JniPlatformId id = JniPlatformId.Unsupported;
            int p = (int)Environment.OSVersion.Platform;
            if ((p == 4) || (p == 6) || (p == 128))
            {
                id = AbstractUnixPlatform.DiscoverPlatformId();
            }
            else if (Environment.OSVersion.Platform.ToString().ToUpperInvariant()[0] == 'W')
            {
                id = JniPlatformId.Windows;
            }
            return id;
        }

        internal static IPlatform Create(JavaVMConfiguration cfg)
        {
            mPlatform = null;
            switch (mPlatformId)
            {
                case JniPlatformId.Windows: mPlatform = new WindowsPlatform(cfg); break;
                case JniPlatformId.Linux: mPlatform = new LinuxPlatform(cfg); break;
                case JniPlatformId.Mac: mPlatform = new MacPlatform(cfg); break;
            }
            if (Platform == null)
            {
                throw new JniException("unrecognized platform (OS).");
            }
            return Platform;
        }

        public static IPlatform Platform
        {
            get
            {
                if (mPlatform == null)
                {
                    throw new JniException("Must call Create");
                }
                return mPlatform;
            }
        }
    }
}
